package com.cskaoyan.javase._2polymorphic._3extend;

/**
 * 思考:
 *      对于一个方法而言,方法的形参数据类型和实参数据类型需要保持一致吗?
 *      不需要,只需要保持"兼容"就可以了
 *      兼容: 一致是可以的,但是只要实参的数据类型能够自动类型转换到形参,也可以传入方法
 *
 * 之前我们已经学过了基本数据类型的自动类型转换在方法调用时的应用
 * 那么引用数据类型也存在自动类型转换(向上转型),也同样符合上述使用特点.
 * 并且,方法的实参和形参以及方法的返回值类型和具体返回值数据类型,都符合上述特点
 *
 *
 * @since 11:26
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(100L);
        test(100);

        test(new Father());
        test(new Son());
        test(new Grandson());
    }

    public static void test(long a) {
    }

    static void test(Father f) {
    }

    static Father test() {
        // return new Father();
        // return new Son();
        return new Grandson();
    }

}

class Father {
    // 方法重写时,子类方法的返回值类型和父类方法需要保持一致吗?
    /*
        答案是不需要
        void和基本数据类型的返回值类型,必须保持一致
        引用数据类型的返回值类型不需要保持一致
        如果父类方法返回父类类型,那么子类重写方法可以返回子类类型(当然保持一致也没问题)
     */
    Father test() {
        return null;
    }

    Object test2(){
        return null;
    }
}

class Son extends Father {
    @Override
    Son test() {
        return null;
    }
}

class Grandson extends Son {
    @Override
    Father test2() {
        return null;
    }
}